package main

import (
	"context"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"time"

	"github.com/go-redis/redis/v8"
)

var ctx = context.Background()

// Структура для представления данных в JSON
type GitHubEvent struct {
	ID        string    `json:"id"`
	Type      string    `json:"type"`
	Actor     Actor     `json:"actor"`
	Repo      Repo      `json:"repo"`
	Payload   Payload   `json:"payload"`
	Public    bool      `json:"public"`
	CreatedAt time.Time `json:"created_at"`
}

type Actor struct {
	ID         int    `json:"id"`
	Login      string `json:"login"`
	GravatarID string `json:"gravatar_id"`
	URL        string `json:"url"`
	AvatarURL  string `json:"avatar_url"`
}

type Repo struct {
	ID   int    `json:"id"`
	Name string `json:"name"`
	URL  string `json:"url"`
}

type Payload struct {
	Ref          string `json:"ref"`
	RefType      string `json:"ref_type"`
	MasterBranch string `json:"master_branch"`
	Description  string `json:"description"`
	PusherType   string `json:"pusher_type"`
}

func main() {
	if len(os.Args) != 2 {
		fmt.Println("Использование: go run main.go /путь/к/вашему/файлу.json")
		os.Exit(1)
	}

	jsonFilePath := os.Args[1]

	// Подключение к Redis
	redisClient := redis.NewClient(&redis.Options{
		Addr:     "localhost:6379", // Адрес вашего Redis-сервера
		Password: "",               // Пароль (если есть)
		DB:       0,                // Индекс базы данных
	})

	// Загрузка данных из JSON-файла
	startTime := time.Now()

	jsonData, err := ioutil.ReadFile(jsonFilePath)
	if err != nil {
		log.Fatal(err)
	}

	var entries []GitHubEvent
	err = json.Unmarshal(jsonData, &entries)
	if err != nil {
		log.Fatal(err)
	}

	// Загрузка данных в Redis
	for _, entry := range entries {
		// Пример для строки
		jsonEntry, err := json.Marshal(entry)
		if err != nil {
			log.Fatal(err)
		}

		err = redisClient.Set(ctx, entry.ID, jsonEntry, 0).Err()
		if err != nil {
			log.Fatal(err)
		}

		// Пример для hset
		hsetKey := fmt.Sprintf("entry:%s", entry.ID)
		err = redisClient.HMSet(ctx, hsetKey, map[string]interface{}{"data": jsonEntry}).Err()
		if err != nil {
			log.Fatal(err)
		}

		// Пример для zset
		zsetKey := "entries_zset"
		score := float64(entry.CreatedAt.Unix())
		err = redisClient.ZAdd(ctx, zsetKey, &redis.Z{
			Score:  score,
			Member: jsonEntry,
		}).Err()
		if err != nil {
			log.Fatal(err)
		}

		// Пример для list
		listKey := "entries_list"
		err = redisClient.LPush(ctx, listKey, jsonEntry).Err()
		if err != nil {
			log.Fatal(err)
		}
	}

	elapsedTime := time.Since(startTime)
	fmt.Printf("Данные успешно загружены в Redis за %v.\n", elapsedTime)
}
